// CreateItemDlg.cpp : implementation file
//

#include "stdafx.h"
#include "dq9.h"
#include "CreateItemDlg.h"

#include "CreateItemPanelFactory.h"
#include "EditItemPanel.h"
#include "EventManagerSngl.h"
#include "EventCodes.h"

#ifdef WIN32
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif //_DEBUG
#endif //WIND32

// CreateItemDlg dialog

namespace serika
{
	namespace dq
	{
		IMPLEMENT_DYNAMIC(CreateItemDlg, CDialog)

		CreateItemDlg::CreateItemDlg(CWnd* pParent /*=NULL*/)
			: CDialog(CreateItemDlg::IDD, pParent)
			, mTab(ItemTab(false))
			, mPanel(0)
		{
		}

		CreateItemDlg::~CreateItemDlg()
		{
		}

		void CreateItemDlg::DoDataExchange(CDataExchange* pDX)
		{
			CDialog::DoDataExchange(pDX);
		}


		BEGIN_MESSAGE_MAP(CreateItemDlg, CDialog)
			ON_WM_DESTROY()
			ON_WM_SHOWWINDOW()
			ON_BN_CLICKED(IDC_ADD_BTN, OnButtonClick)
		END_MESSAGE_MAP()

		BOOL CreateItemDlg::OnInitDialog()
		{
			CDialog::OnInitDialog();

			this->MoveWindow(160, 256, 400, 600);
			//this->CenterWindow();

			mTab.SubclassDlgItem(IDC_CREATE_ITEM_TAB, this);

			mPanel = new EditItemPanel(this);
			mPanel->Create(EditItemPanel::IDD, &mTab);
			CreateItemPanelFactory* fac = new CreateItemPanelFactory;
			fac->SetPanel(mPanel);

			mTab.Initialize(fac);

			CWnd* wnd = this->GetDlgItem(IDC_ADD_BTN);
			CRect rect, clientRect;
			this->GetClientRect(&clientRect);
			wnd->GetClientRect(&rect);
			rect.MoveToXY(clientRect.right-rect.Width(), clientRect.bottom-rect.Height());
			wnd->MoveWindow(rect);
			wnd->BringWindowToTop();

			this->GetNewItem();

			return TRUE;
		}

		// CreateItemDlg message handlers
		void CreateItemDlg::OnDestroy()
		{
			if (mPanel)
			{
				mPanel->DestroyWindow();
				delete mPanel;
				mPanel = 0;
			}

			mTab.Finalize();
		}

		void CreateItemDlg::OnShowWindow(BOOL bShow, UINT nStatus)
		{
			if (bShow)
			{
				mTab.Activate();
			}
			else
			{
				mTab.Deactivate();
			}
		}

		void CreateItemDlg::OnButtonClick()
		{
			Item* item = mPanel->GetItem();
			ut::Event* e = ut::Event::NewEvent(ut::EventType::UI, UEC::CreateItem);
			e->SetUserData(item);
			EventManager::SendEvent(e);

			this->GetNewItem();
		}

		void CreateItemDlg::OnCancel()
		{
			CDialog::OnCancel();

			mTab.Deactivate();

			EventManager::SendEvent(ut::EventType::UI, UEC::SaveItem);
		}

		void CreateItemDlg::Handle(const ut::Event& e)
		{
			if (LEC::Item == e.GetCode())
			{
				this->OnItem(e);
			}
		}

		void CreateItemDlg::OnItem(const ut::Event& e)
		{
			mPanel->SetItem(e.GetUserData<Item>());
		}

		void CreateItemDlg::GetNewItem()
		{
			EventManager::AttachLogicEventHandler(this);
			ut::Event* newItemEvent = ut::Event::NewEvent(ut::EventType::UI, UEC::RequestNewItem);
			EventManager::SendEvent(newItemEvent);
			EventManager::DetachLogicEventHandler(this);
		}
	}
}

